Lineamientos Mainframe COBOL 6.3

Objetivo

Señalar cuáles son los problemas ocasionados por la compilación de los programas con la nueva versión de COBOL (versión 6.3), y cómo prevenirlos para evitar resultados inexactos.


Migración a la versión 6.3 de COBOL

Se está migrando el compilador a la versión 6.3, y esto conlleva algunos cambios en la forma en que trabajan actualmente puntos específicos de los programas. Este documento describirá esos puntos, los cuales el programador deberá tomar en cuenta en la creación o modificación de los programas COBOL.


Los puntos para tratar son:


1. Redefinición de variables numéricas en variables alfanuméricas.

2. Sobrellenado de datos binarios.

3. Tamaño diferente entra parámetros y argumento.

4. Variables que son usadas antes de asignárseles un valor.

5. Uso del PERFORM.



Al final de este documento se muestra una tabla que funciona como guía rápida de errores, la cual incluye la descripción de éstos y las acciones a realizar para corregirlos.


1.Redefinición de variables numéricas en variables alfanuméricas.

La nueva versión 6.3 de COBOL puede procesar datos no válidos durante el tiempo de ejecución. Esto quiere decir que al realizar una operación aritmética con datos no numéricos, no causará un abend durante la ejecución debido a que el valor es determinado por la zona numérica de la variable.


Explicación.


No todos los arreglos de bits son valores decimales válidos. Por ejemplo, consideremos el número -123. Hay varias formas de representarlo mediante el uso de la cláusula PIC, y hay que tomar en cuenta que cada una de estas representaciones limita la forma como se ve el dato y, por lo tanto, cómo se trabaja con él.

Si representamos el dato como decimal, por ejemplo PIC S9(03), tendremos

F1 F2 D3

Este número tiene tres dígitos, los cuales deben estar entre 0 y 9. Asimismo, tiene un código de signo, el cual debe estar entre A y F. En este caso, la letra D significa que el número es negativo.

También cuenta con una zona de bits que siempre es F.

Ahora, si este mismo número lo declaramos como un packed decimal, tenemos una representación diferente.

12 3D

Este número tiene también tres dígitos y un código de signo, pero no tiene zona de bits.


Ejemplificando esto con un programa, se prueba asignar sólo letras a un campo alfanumérico y revisar el comportamiento del campo numérico que fue redefinido en éste.


Código.

77 A1 PIC X(4) VALUE ’ ’.

77 A2 REDEFINES A1 PIC 9(4).

77 A3 PIC 9(4) VALUE ZEROES.


MOVE 'ABCD' TO A1

IF A2 > 0

DISPLAY '> CERO'

DISPLAY 'VOY A REALIZAR UNA OPERACION'

COMPUTE A3 = A2 + 5

DISPLAY 'COMPUTE A3 = A2 + 5'

DISPLAY 'RESULTADO -->' A3

DISPLAY '-----------------------------'

ELSE

DISPLAY 'NOT > 0'

END-IF


Ejecución.


********************************* TOP OF DATA **********************************

IGZ0279W The value X'C1C2C3C4' of data item A2 at the time of reference by statement number 1 on line 348 in program KRBLMEX3 failed the NUMERIC class test or contained a value larger than the PICTURE clause as detected by the NUMCHECK compiler option.


> CERO

VOY A REALIZAR UNA OPERACION


IGZ0279W The value X'C1C2C3C4' of data item A2 at the time of reference by statement number 1 on line 351 in program KRBLMEX3 failed the NUMERIC class test or contained a value larger than the PICTURE clause as detected by the NUMCHECK compiler option.


COMPUTE A3 = A2 + 5

RESULTADO -->1239


En este ejemplo el campo redefinido A2 toma los valores numéricos del hexadecimal X’C1C2C3C4’.

Como puede verse, el programa no termina con un abend, si no que envía un mensaje de aviso y continúa la ejecución. Esto representa un problema grave porque está dando un valor falso a la variable (1234’).


Pasos a seguir para corregir el error.


Deben identificarse las variables numéricas que hayan sido redefinidas en variables alfanuméricas, y al usar la variable numérica, asegurarse que el valor contenido es numérico mediante la sentencia IF variable IS NUMERIC.

Identificar los valores explícitamente no válidos en el programa y corregirlos.

Las sentencias MOVE que se realizan de forma grupal deberán hacerse campo por campo, o modificarlas por MOVE CORRESPONDING.


2. Sobrellenado de datos binarios.

Este punto se refiere al manejo de las variables binarias a las que se les asignan valores con más dígitos de los que le fueron especificados.


Explicación.


Como en el punto anterior, existe una diferencia de resultados entre las dos versiones de los compiladores cuando se ejecutan las mismas sentencias.


Se tienen estas líneas de código.


01 A5 PIC X(2).

01 A6 REDEFINES A5 PIC 9(3) BINARY.

01 B PIC 9(2) VALUE 2.

01 C PIC 9(3).


MOVE HIGH-VALUES TO A5

DISPLAY 'A5 --> ' A5

DISPLAY 'A6 --> ' A6

COMPUTE C = A6 * B

DISPLAY 'C --> ' C


Debe tomarse en cuenta que el valor del campo A5 queda como x’FFFF’, lo cual significa que el valor numérico queda con 65535 (5 digitos).


Al ejecutar este programa, compilado con la versión 6, se obtiene este resultado que incluye un warning avisando que el número de dígitos manejados exceden de los especificados.


********************************* TOP OF DATA **********************************

A5 -->

IGZ0316W The value X'FFFF' of data item A6 at the time of reference by statement number 1 on line 354 in program

KRBLMEX3 was invalid. The value exceeded the number of digits in the data definition, and failed the SIZE

ERROR test generated by the NUMCHECK(BIN) compiler option.

A6 --> 535

C --> 070

El valor del campo A6 queda truncado (de 65535 a 535).


Se ejecuta ahora el programa compilado con la versión 4, y éste es el resultado.

********************************* TOP OF DATA **********************************

A5 -->

A6 --> 535

C --> 002


Lo que se nota a primera vista es la diferencia de resultados en la variable C porque, a pesar que la variable A6 despliega el mismo valor en ambas ejecuciones, no sucede lo mismo al obtener el valor de la variable C.


Estos resultados son obtenidos como consecuencia de las opciones de los compiladores:

  • El resultado es 070 con la opción TRUNC(cualquier valor) para la V6.

  • El resultado es 002 cuando en la versión 4 se usa la opción TRUNC con los valores STD u OPT.


En general el resultado no puede ser predecible porque dependerá de la secuencia exacta de las instrucciones generada por el compilador.

El resultado que se obtenga con el uso de la opción TRUNC(OPT) dependerá del número de dígitos declarados. Serán resultados impredecibles y diferentes entre compiladores. Esto lleva a la conclusión de que una vez compilados los programas con la nueva versión, los resultados podrían ser diferentes con los que se obtienen con los programas que actualmente están compilados con la versión anterior.



Pasos a seguir para corregir el error.


  • Se recomienda incluir la cláusula ON SIZE ERROR para identificar el error.

  • Corregirlo dependerá del contexto. En el caso del ejemplo mostrado, será aumentando el número de dígitos, que sería a cinco en lugar de tres.

  • Se deberá evitar y/o corregir los errores de código donde haya problemas por truncamiento.

  • Si el valor viene desde otras fuentes, deberá corregirse la fuente y adicionar código para forzar un truncamiento.


3. Tamaño diferente entra parámetros y argumento.


Este punto señala la problemática que existe cuando un programa hace un llamado a otro programa, y el área de LINKAGE es diferente entre ambos.


Cuando existe un llamado entre programas, es necesario que el área de LINKAGE entre ambos sea del mismo tamaño ya que, de no ser así, habrá un problema si el programa que fue llamado trabaja con los bytes que sobrepasan los declarados en el programa origen.


Explicación.


El programa principal está declarando una variable con una longitud de 100 caracteres, y hace el llamado a un programa enviando esta variable como área de comunicación.


Programa llamador.

77 PARAM-O PIC X(100).

PROCEDURE DIVISION USING PARAM.

0000-MAINLINE.

MOVE SPACES TO PARAM-O

MOVE 'DATOS ORIGEN PARA PRUEBA PITFALL #3' TO PARAM-O

DISPLAY 'PARAM-O 1 --> ' PARAM-O

CALL 'KRBLMEX4' USING PARAM-O

END-CALL

DISPLAY 'PARAM-O ---> ' PARAM-O


El programa que es llamado está usando un área de comunicación con una longitud superior a la especificada por el programa que lo llamó.


Programa llamado.

LINKAGE SECTION.

01 PARAM-D PIC X(500).

PROCEDURE DIVISION USING PARAM-D.

0000-MAINLINE.

MOVE 'PRUEBA PITFALL #3' TO PARAM-D(300:25)

DISPLAY 'PARAM-D ---> ' PARAM-D

Si durante la ejecución el programa llamado utiliza las posiciones extra, estará causando un problema de corrupción de datos la cual es detectada por el compilador, así que enviará un mensaje para identificar este error.


IGZ0318W The CALL statement on line xxx in program programa caused corruption of data beyond the end of the WORKING-STORAGE SECTION.



Pasos a seguir para corregir el error.


Incluir en el compilador el parámetro PARMCHECK con el valor (*,400), o mayor si es necesario.

Compilar el programa con el nuevo parámetro, y realizar pruebas de regresión.

Modificar el código fuente para que la longitud del área de comunicación entre ambos programas, sea la misma.


4. Variables que son usadas antes de asignárseles un valor.


Este punto trata sobre el comportamiento de las variables cuando son utilizadas antes de haber sido inicializadas.

Una ayuda proporcionada por esta nueva versión es el uso de la opción INITCHECK, la cual puede identificar durante la compilación aquellas variables que no han sido inicializadas, y enviar en la salida mensajes de aviso referenciando este hecho.


Explicación.


Tenemos las siguientes líneas en un programa, donde se pretende usar las variables sin antes haberlas inicializado.


WORKING-STORAGE SECTION.

01 X PIC X(100).

01 Y PIC 9(5).

01 Z PIC 9(3) BINARY.

01 W PIC 9(3) BINARY.


PROCEDURE DIVISION USING PARAM.

DISPLAY "X: " X

DISPLAY "W: " W

DISPLAY "Y: " Y

DISPLAY "Z: " Z

IF Y > 100

DISPLAY 'Y ES MAYOR A 100 --> ' Y

COMPUTE W = Z + 1

DISPLAY 'W = Z + 1'

DISPLAY 'NUEVO VALOR DE W --> ' W

ELSE

DISPLAY 'Y NO ES MAYOR A 100 --> ' Y

END-IF



Al compilar el programa con la nueva versión, la salida de la compilación marca, mediante un mensaje de aviso, las variables que están siendo usadas sin antes haber sido inicializadas con algún valor.


* * * * * E N D O F C O M P I L A T I O N * * * * *

PP 5655-EC6 IBM Enterprise COBOL for z/OS 6.3.0 P200512 KRBLMEX3 Date 10/14/2020 Time 15:45:47 Page 69

LineID Message code Message text

366 IGYCB7311-W The data item 'X' may be used at this statement before it is set.

367 IGYCB7311-W The data item 'W' may be used at this statement before it is set.

Same message on line: 367 367

368 IGYCB7311-W The data item 'Y' may be used at this statement before it is set.

Same message on line: 368 368 370 370 370 371 371 371 376 376 376

369 IGYCB7311-W The data item 'Z' may be used at this statement before it is set.

Same message on line: 369 369 372 372 372



Si no se corrige la inicialización de las variables, entonces la ejecución del programa señala las variables no inicializadas mediante un mensaje de aviso.


SDSF OUTPUT DISPLAY TN6MROEX JOB49751 DSID 105 LINE 0 COLUMNS 01- 80

COMMAND INPUT ===> SCROLL ===> CSR

********************************* TOP OF DATA **********************************

X:

W: 000

IGZ0279W The value X'0000000000' of data item Y at the time of reference by statement number 1 on line 368 in program

KRBLMEX3 failed the NUMERIC class test or contained a value larger than the PICTURE clause as detected by

the NUMCHECK compiler option.

Y:

Z: 000

W = Y + 1

NUEVO VALOR DE W --> 001


Los valores de las variables no inicializadas dependerán de las opciones del tiempo de ejecución, de cómo el compilador dispone la memoria o de dónde fue cargado el programa, y todo esto hace imposible tener un valor específico. Además, esta nueva versión no garantiza que la memoria no inicializada tenga el mismo valor que tenía con la versión anterior, lo que provocaría resultados diferentes a los que se venían obteniendo.


Pasos a seguir para corregir el error.


  1. Revisar la salida de la compilación para verificar que no existan avisos de variables no inicializadas.

  2. Asignar un valor a las variables antes de ser utilizadas. Esto puede realizarse mediante el uso de MOVE, INITIALIZE o la cláusula VALUE.



5. Uso del PERFORM.


La nueva versión 6.3 está proporcionando mensajes de aviso respecto a la estructura de la sentencia PERFORM, las cuales son marcadas en la salida de la compilación.

Si se codifica el PERFORM con su extensión THRU, el compilador checa si es posible llegar a cumplir ese ciclo.


Por ejemplo se tiene esta codificación.

PERFORM 8000-FINAL

THRU 8000-FINAL-EXIT

.

.

8000-FINAL.

IF SI-SALIDA

CLOSE ARCH-SAL

END-IF

IF SEM-KCIMCAT-ABIERTO

PERFORM 2400-CIERRA-KCIMCAT

THRU 2400-CIERRA-KCIMCAT-EXIT

END-IF

STOP RUN.

8000-FINAL-EXIT.

EXIT.


La salida de la compilación marca estos avisos.



610 IGYCB7309-W There may be a loop from the "PERFORM" statement at "PERFORM (line 610.1)" to itself.

610 IGYCB7310-W The "PERFORM" statement at "PERFORM (line 610.1)" cannot reach its exit.


Estos mensajes los envió por la sentencia STOP RUN que está antes de que se pueda alcanzar el fin del párrafo.

Este apartado es una ayuda para el programador, quien puede cerciorarse de esta manera que la estructura de los PERFORM utilizados en su programa, sea la correcta.


Como sugerencia, se pide al programador tener como práctica fija revisar la salida de la compilación aunque ésta termine con código 04 ó 05, ya que los mensajes de aviso son una referencia importante para visualizar errores antes de que éstos se presenten en el ambiente productivo.

6. Guía rápida de errores.

7. Tarjeta Job en Endevor


Algunos trabajos de compilación están terminando con el abend 4093, lo cual está ligado con el manejo de memoria.

Al generar un SCL en ENDEVOR para adicionar o actualizar un elemento, por default la herramienta genera una tarjeta de job con las siguientes características:

Con el fin de evitar el abend 4093, será necesario modificar la tarjeta del job para hacer que sea el Sistema Operativo quien asigne la memoria necesaria para el trabajo.

De este modo, la tarjeta deberá quedar de la siguiente manera:

//userXX JOB (GNPS,6),'GENERADOR PRODUC',NOTIFY=user,

// MSGCLASS=X,CLASS=T,MSGLEVEL=(1,1),REGION=0M


Una vez modificada la tarjeta, el SCL puede ser submitido.

Parámetros para compilación fuera de ENDEVOR.

Debido al cambio de versión del compilador de COBOL, es necesario que los compiladores externos, es decir fuera de ENDEVOR, contengan los siguientes parámetros en el paso correspondiente a la compilación, con el fin de igualarlos con los que está utilizando la herramienta ENDEVOR.

Los parámetros son los siguientes:

// PARM=(APOST,LIST,MAP,SSRANGE,PARMCHECK,FSRT,INITCHECK,

// NUMCHECK,NOSEQ,TEST,DATA(31),ADV)

Además debe tenerse en cuenta que el alias que apunta a la biblioteca de COBOL deberá ser

SYS2.COBOL.SIGYCOMP




8. Sesiones Informativas

En este vídeo se puede observar la información proporcionada a las torres de mantenimiento y desarrollo respecto a la nueva versión de Cobol 6.3 el 7 de Abril de 2021.


Sesión informativa Cobol 6 (2021-04-07 at 13_03 GMT-7).mp4